package com.example.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * RegexUtils 工具类，用于处理常见的正则表达式操作
 */
public class RegexUtils {

    /**
     * 验证字符串是否匹配正则表达式
     *
     * @param regex 正则表达式
     * @param input 输入字符串
     * @return 是否匹配
     */
    public static boolean matches(String regex, String input) {
        if (regex == null || input == null) {
            return false;
        }
        return Pattern.matches(regex, input);
    }

    /**
     * 查找所有匹配正则表达式的子串
     *
     * @param regex 正则表达式
     * @param input 输入字符串
     * @return 匹配的子串列表
     */
    public static List<String> findAll(String regex, String input) {
        List<String> result = new ArrayList<>();
        if (regex == null || input == null) {
            return result;
        }
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            result.add(matcher.group());
        }
        return result;
    }

    /**
     * 替换所有匹配正则表达式的子串
     *
     * @param regex       正则表达式
     * @param input       输入字符串
     * @param replacement 替换字符串
     * @return 替换后的字符串
     */
    public static String replaceAll(String regex, String input, String replacement) {
        if (regex == null || input == null || replacement == null) {
            return input;
        }
        return input.replaceAll(regex, replacement);
    }

    /**
     * 按照正则表达式分割字符串
     *
     * @param regex 正则表达式
     * @param input 输入字符串
     * @return 分割后的字符串数组
     */
    public static String[] split(String regex, String input) {
        if (regex == null || input == null) {
            return new String[0];
        }
        return input.split(regex);
    }

    /**
     * 提取匹配的内容
     *
     * @param regex 正则表达式
     * @param input 输入字符串
     * @param group 提取的组索引，从 0 开始
     * @return 提取的内容列表
     */
    public static List<String> extract(String regex, String input, int group) {
        List<String> result = new ArrayList<>();
        if (regex == null || input == null || group < 0) {
            return result;
        }
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            result.add(matcher.group(group));
        }
        return result;
    }

    /**
     * 统计字符串中匹配正则表达式的子串个数
     *
     * @param regex 正则表达式
     * @param input 输入字符串
     * @return 匹配的子串个数
     */
    public static int countMatches(String regex, String input) {
        if (regex == null || input == null) {
            return 0;
        }
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        return count;
    }

    // 示例：常用正则表达式
    public static final String REGEX_EMAIL = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";//邮箱
    public static final String REGEX_PHONE = "^\\d{10,11}$";//电话
    public static final String REGEX_URL = "^(http|https)://[^\\s]+$";//网络地址
    public static final String REGEX_NUMBER = "^[0-9]+$";//数字
    public static final String REGEX_POSTAL_CODE = "^[1-9]\\d{5}$";//邮政编码
    public static final String REGEX_ID_CARD = "^(\\d{15}|\\d{18}|\\d{17}[Xx])$";//身份证
    // 用户名（字母开头，允许字母、数字、下划线，长度 3-16）：
    public static final String REGEX_USERNAME = "^[a-zA-Z][a-zA-Z0-9_]{2,15}$";
    //强密码（至少 8 个字符，包含大写字母、小写字母、数字和特殊字符）
    public static final String REGEX_STRONG_PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";

}

